home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2004 #11
/
Amiga Plus CD - 2004 - No. 11.iso
/
AmiSoft
/
Misc
/
emu
/
fbzx.lha
/
fbzx
/
sound.c
< prev
next >
Wrap
C/C++ Source or Header
|
2004-08-26
|
3KB
|
138 lines
#include "Z80.h"
#include "computer.h"
#include "emulator.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#ifndef AMIGA
#include <sys/soundcard.h>
#endif
int audio_fd;
char sound_type; // 0=OSS, 1=no sound
int sound_init(int wfreq,int wbuff) {
int parameter;
int parameter2;
int bytes,stereo;
if(sound_type==1) { // no sound; simulate 8bits mono
ordenador.sign=0;
ordenador.format=0;
ordenador.channels=1;
ordenador.channels = 1;
ordenador.freq=48000;
ordenador.buffer_len=4800; // will wait 1/10 second
return (0);
}
#ifndef AMIGA
audio_fd=open("/dev/dsp",O_WRONLY); // open DSP
if(audio_fd==-1)
return (-1);
// set format
if(ioctl(audio_fd,SNDCTL_DSP_GETFMTS, ¶meter2)==-1)
return (-2);
// Priority: U8, S8, U16LE, S16LE, U16BE, U16LE
if(parameter2 & AFMT_S16_BE)
parameter = AFMT_S16_BE;
if(parameter2 & AFMT_U16_BE)
parameter = AFMT_U16_BE;
if(parameter2 & AFMT_S16_LE)
parameter = AFMT_S16_LE;
if(parameter2 & AFMT_U16_LE)
parameter = AFMT_U16_LE;
if(parameter2 & AFMT_S8)
parameter = AFMT_S8;
if(parameter2 & AFMT_U8)
parameter = AFMT_U8;
bytes=0; //8 bits
stereo=0; // no stereo
parameter=AFMT_U8;
if(ioctl(audio_fd,SNDCTL_DSP_SETFMT,¶meter) == -1)
return (-2);
switch(parameter) {
case AFMT_U8:
ordenador.sign=0;
ordenador.format=0;
ordenador.channels=1;
break;
case AFMT_S8:
ordenador.sign=-128;
ordenador.format=0;
ordenador.channels=1;
break;
case AFMT_U16_LE:
ordenador.sign=0;
ordenador.format=1;
ordenador.channels=2;
break;
case AFMT_S16_LE:
ordenador.sign=-128;
ordenador.format=1;
ordenador.channels=2;
break;
case AFMT_U16_BE:
ordenador.sign=0;
ordenador.format=2;
ordenador.channels=2;
break;
case AFMT_S16_BE:
ordenador.sign=-128;
ordenador.format=2;
ordenador.channels=2;
break;
}
parameter = 1; // we want mono audio
if(ioctl(audio_fd,SNDCTL_DSP_CHANNELS, ¶meter)==-1)
return (-3);
ordenador.channels = parameter;
parameter=48000; // we want, by default, 48000 samples per second
if(ioctl(audio_fd,SNDCTL_DSP_SPEED, ¶meter)==-1)
return (-3);
ordenador.freq=parameter;
if(ordenador.freq<=24000) // the maximum available frequency in lower than 24000?
parameter=0x002B ; // two buffers with 2048 bytes each one
else
parameter=0x002C ; // two buffers with 4096 bytes each one
if(ioctl(audio_fd,SNDCTL_DSP_SETFRAGMENT, ¶meter)==-1)
return (-4);
if(ioctl(audio_fd,SNDCTL_DSP_GETBLKSIZE, ¶meter)==-1)
return (-4);
ordenador.buffer_len=parameter;
#else
#warning no sound support yet
#endif
return(0);
}
void sound_play() {
ordenador.current_buffer=sound[0];
if(sound_type==1) { // no sound
usleep(75000); // wait 1/20 second
return;
}
write(audio_fd,sound[0],ordenador.buffer_len);
}
void sound_close() {
if(sound_type==0)
close(audio_fd);
}